package com.atguigu.cloud.controller;

import com.atguigu.cloud.apis.PayFeignApi;
import io.github.resilience4j.bulkhead.annotation.Bulkhead;
import io.github.resilience4j.circuitbreaker.annotation.CircuitBreaker;
import io.github.resilience4j.ratelimiter.annotation.RateLimiter;
import jakarta.annotation.Resource;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RestController;

/**
 * @author bairimengchang
 * @version 1.0
 * @project cloud2024
 * @description 订单熔断测试控制器
 * @date 2024/9/14
 */
@RestController
public class OrderCircuitController {

    @Resource
    private PayFeignApi payFeignApi;

    /**
     * 测试断路器
     * @param id
     * @return
     */
//    @GetMapping(value = "/feign/pay/circuit/{id}")
//    @CircuitBreaker(name = "cloud-payment-service", fallbackMethod = "myCircuitFallback")
//    public String myCircuitBreaker(@PathVariable("id") Integer id) {
//        return payFeignApi.myCircuit(id);
//    }
//
//    //myCircuitFallback就是服务降级后的兜底处理方法
//    public String myCircuitFallback(Integer id, Throwable t) {
//        // 这里是容错处理逻辑，返回备用结果
//        return "myCircuitFallback，系统繁忙，请稍后再试-----/(ㄒoㄒ)/~~";
//    }

    /**
     * 测试舱壁隔离（信号量限流）
     * 用浏览器隐式模式测试
     * @param id
     * @return
     */
    @GetMapping(value = "/feign/pay/bulkhead/{id}")
    @Bulkhead(name = "cloud-payment-service", fallbackMethod = "myBulkheadFallback", type = Bulkhead.Type.SEMAPHORE)
    public String myBulkhead(@PathVariable("id") Integer id) {
        return payFeignApi.myBulkhead(id);
    }

    public String myBulkheadFallback(Throwable t) {
        return "myBulkheadFallback，隔板超出最大数量限制，系统繁忙，请稍后再试-----/(ㄒoㄒ)/~~";
    }

    @GetMapping(value = "/feign/pay/ratelimit/{id}")
    @RateLimiter(name = "cloud-payment-service",fallbackMethod = "myRatelimitFallback")
    public String myRatelimit(@PathVariable("id") Integer id) {
        return payFeignApi.myRatelimit(id);
    }

    public String myRatelimitFallback(Integer id,Throwable t) {
        return "你被限流了，禁止访问/(ㄒoㄒ)/~~";
    }
}
